package com.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: 张波
 * @Time: 2025/8/20 11:41
 */
@Component("myAspect")
@Aspect
public class MyAspect {
	/**
	 * Spring AOP通知执行的顺序如下
	 * ⚡ 通知执行顺序（如果都有）
	 * 环绕通知（前部分）
	 * 前置通知（@Before）
	 * 目标方法执行
	 * 环绕通知（后部分）
	 * 后置通知（@AfterReturning 或 @AfterThrowing）
	 * 最终通知（@After）
	 */
	// 1️⃣ 抽取切点
	@Pointcut("execution(* com.aop.*.*(..))")
	public void myPointcut() {
		// 方法体一般留空
	}
	//前置通知
	@Before("myPointcut()")
	public void before(){
		System.out.println("前置代码增强.....");
	}
	//后置通知
	@AfterReturning("myPointcut()")
	public void AfterReturning(){
		System.out.println("后置代码增强");
	}
	//最终通知
	@After("myPointcut()")
	public void After(){
		System.out.println("最终通知");
	}
	//异常通知
	@AfterThrowing("myPointcut()")
	public void AfterThrowing(){
		System.out.println("异常通知】方法执行出错时执行");
	}
	//环绕配置
	@Around("myPointcut()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("环绕通知前 在目标方法执行前");
		Object proceed = pjp.proceed();
		System.out.println("环绕通知后 在目标方法执行后");
		return proceed;
	}
}
